<?php

require_once 'classes/Compte.php';
require_once 'SCinterface.php';
require_once 'classes/Message.php';
require_once '../config/config.php';

/**
 * Classe du service CRUD pour la gestion des comptes
 * 
 * @author Manixab Billy
 */

class SCcompte implements SCinterface {
    
    private $db;
    
    /**
     *Contructeur créant l'objet pour la connexion à la DB 
     */
    public function __construct() {
        $this->db = new PDO(ACA_DB_DSN, ACA_DB_USER, ACA_DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
    }
    
    /**
     * Ajoute un compte
     * @param unCompte un compte à ajouter
     * @return Message
     */
    public function ajouter($unCompte) {
        try {
            
            $query =  $this->db->prepare("INSERT INTO compte " .
                   "(username, password) VALUES(:username, md5(:password));");

            $query->execute(array(
                    'username'              => $unCompte->getUsername(),
                    'password'              => $unCompte->getPassword()
               ));
            
            
        }
        catch(PDOException $e) {
            return new Message("Compte non ajouté: ".$e->getMessage());
        }
        return $unCompte;
    }
    
    /**
     * Methode permettant de modifier un compte
     * @param unCompte Compte à modifier
     * @return Message  
     */
    public function modifier($unCompteAModifier) {
        try {
            $query = "UPDATE compte SET 
                password = '".$unCompteAModifier->getPassword()."'
                     WHERE username='".$unCompteAModifier->getUsername()."';";
            
            $this->db->query($query);

        }
        catch(PDOException $e) {
           return new Message("Compte non modifié: ".$e->getMessage());
        }
        return $unCompteAModifier;
    }
    
    /**
     * Methode permettant de supprimer un compte
     * @param unCompte Compte à supprimer
     * @return Message  
     */
    public function supprimer($unCompteASupprimer) {
        try{
        $query = "DELETE FROM compte WHERE username = '".$unCompteASupprimer."';";
                   
            $this->db->exec($query);
            $message = new Message("Compte supprimé");
        }
        catch(PDOException $e){
            $message = new Message("Compte non supprimé: ".$e->getMessage());
        }
        return $message;
    }
    
     /**
     * @param unCompte Compte de recherche sous forme d'objet Compte
     * @return un tableau d'objet Compte
     */
    public function lister($compteALister){
        try {
            $query = "SELECT * FROM compte ";
            $query_Where="WHERE";
            if ($compteALister != NULL) {
                if ($compteALister->getUsername()!=NULL) {
                    $query_Where .=" username = '".$compteALister->getUsername()."'";
                    $query.=$query_Where;
                }
            }
        
            
            $lesComptesTrouves = null;
            $unCompteLu = null;
            $result=$this->db->query($query);
            
            while($row=$result->fetch()) {
                $unCompteLu = new Compte($row["username"], $row["password"]);
                $lesComptesTrouves[] = $unCompteLu;
            }

        }
        catch(PDOException $e) {
            print($e->getMessage());
        }
        return $lesComptesTrouves;
    }
        //Fonctoin permettant de vérifier les droits d'un utilisateur vis-à-vis d'une fonction qu'il souhaite utiliser.
        public function verifierPermissions($username, $permission){
        try {
            $query = "SELECT compte.username, permission.nom FROM compte 
                      INNER JOIN comptetogroupe ON compte.username = comptetogroupe.compte_username
                      INNER JOIN groupetopermission ON groupetopermission.groupe_nom = comptetogroupe.groupe_nom
                      INNER JOIN permission ON permission.nom = groupetopermission.permission_nom WHERE compte.username = '".$username."';";
            $result=$this->db->query($query);
            while($row=$result->fetch()) {  
                if($row['nom'] == $permission){
                    $permissionAccordee = TRUE;
                    break;
                }else{
                    $permissionAccordee = FALSE;
                }
            }
        }
        catch(PDOException $e) {
            print($e->getMessage());
        }
        return $permissionAccordee;
    }
    
} 
?>
